//package com.zyf.cloud.common.utils;
//
//
//import com.bonade.common.constant.Constants;
//import com.bonade.common.exception.BusinessException;
//import com.bonade.common.support.HttpCode;
//import com.bonade.common.support.cache.CacheType;
//import com.bonade.common.support.cache.CacheWapper;
//import com.bonade.common.support.cache.RedissonManager;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.springframework.util.StringUtils;
//
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
//
///**
// * 缓存工具类
// *
// * @author Administrator
// *
// */
//public class CacheUtil {
//	private static Logger logger = LogManager.getLogger(CacheUtil.class);
//	private static RedissonManager cacheManager;
//
//	private static Map<String, Map<String, CacheWapper>> caches = new ConcurrentHashMap<>();
//	private final static long expiresTime=600000;
//
//	public static void setRedissonManager(RedissonManager cacheManager) {
//		CacheUtil.cacheManager = cacheManager;
//	}
//
//	public static RedissonManager getCache() {
//		return cacheManager;
//	}
//
//	/**
//	 *
//	 * 获取锁 锁定定时长(毫秒数)
//	 */
//	public static boolean getLock(String key, int expires) {
//		try {
//			logger.debug("获取锁开始:" + key + " timestamp:" + System.currentTimeMillis());
//			if (getCache().lock(key, expires)) {
//				logger.debug("获取锁成功:key ==> " + key);
//				return true;
//			}
//			logger.warn("获取锁结束:" + key + " timestamp:" + System.currentTimeMillis());
//			return false;
//		} catch (Exception e) {
//			logger.error(Constants.Exception_Head + "获取锁异常key ==> " + key, e);
//			return false;
//		}
//	}
//
//	/**
//	 *
//	 * 获取锁 默认锁定180秒
//	 */
//	public static boolean getLock(String key){
//		int expires = 1000 * PropertiesUtil.getInt("redis.lock.expires", 180);
//		return getLock(key,expires);
//	}
//
//	/**
//	 * 解锁
//	 */
//	public static void unlock(String key) {
//		try{
//			cacheManager.unlock(key);
//			logger.info("解锁成功  key ==> " + key + " timestamp:" + System.currentTimeMillis());
//		}catch(Exception e ){
//			logger.info("解锁失败  key ==> " + key + " 不存在,或已解锁! timestamp:" + System.currentTimeMillis());
//		}
//
//	}
//
//	private static Map<String, CacheWapper> getNameSpaceCaches(String nameSpace) {
//		Map<String, CacheWapper> cacheMap = caches.get(nameSpace);
//
//		if (cacheMap == null) {
//			cacheMap = new ConcurrentHashMap<>();
//		}
//		return cacheMap;
//	}
//
//	/**
//	 * 通过key获取缓存里面的配置项的值
//	 *
//	 * @param key
//	 * @return
//	 */
//	public static String getCacheParam(String key) {
//		return gethCache(Constants.CACHE_SYS_PARAM + Constants.SYSPARAM, key, PropertiesUtil.getString(key));
//	}
//
//	/**
//	 * 通过key获取缓存里面的配置项的值
//	 *
//	 * @param key
//	 * @return
//	 */
//	public static String getCacheParam(String key, String defaultValue) {
//		String paramValue = getCacheParam(key);
//		if (paramValue == null) {
//			return defaultValue;
//		}
//		return paramValue;
//	}
//
//	/**
//	 * 通过key获取缓存里面的配置项的值
//	 *
//	 * @param key
//	 * @return
//	 */
//	public static Object getCacheDic(String key) {
//		return getCache(Constants.CACHE_SYS_PARAM + Constants.SYS_DIC, key, "[]");
//	}
//
//	public static Object getCache(String nameSpace, String key, Object defualtValue) {
//		Map<String, CacheWapper> caches = getNameSpaceCaches(nameSpace);
//		CacheWapper cacheWapper = caches.get(key);
//		if (cacheWapper == null) {
//			Object paramValue = CacheUtil.getCache().get(nameSpace + key);
//			if (paramValue == null) {
//				logger.error("getCache: ==> " + nameSpace + key + "为空!");
//				paramValue = defualtValue;
//				caches.put(key, new CacheWapper(paramValue, CacheType.Local));
//			} else {
//				caches.put(key, new CacheWapper(paramValue, System.currentTimeMillis() + expiresTime, CacheType.Redis));
//			}
//		} else if (cacheWapper.getCacheType() == CacheType.Redis
//				&& cacheWapper.getExpiresTime() < System.currentTimeMillis()) {
//			Object paramValue = CacheUtil.getCache().get(nameSpace + key);
//			cacheWapper.setValue(paramValue);
//			cacheWapper.setExpiresTime(System.currentTimeMillis() + expiresTime);
//			caches.put(key, cacheWapper);
//		}
//		return cacheWapper.getValue();
//	}
//
//	public static String gethCache(String nameSpace, String key, Object defualtValue) {
//		Map<String, CacheWapper> caches = getNameSpaceCaches(nameSpace);
//		CacheWapper cacheWapper = caches.get(key);
//		if (cacheWapper == null) {
//			Object paramValue = CacheUtil.getCache().hget(nameSpace, key);
//			if (paramValue == null) {
//				logger.error("gethCache: ==> " + nameSpace + key + "为空!");
//				paramValue = defualtValue;
//				caches.put(key, new CacheWapper(paramValue, CacheType.Local));
//			} else {
//				caches.put(key, new CacheWapper(paramValue, System.currentTimeMillis() + expiresTime, CacheType.Redis));
//			}
//
//		} else if (cacheWapper.getCacheType() == CacheType.Redis
//				&& cacheWapper.getExpiresTime() < System.currentTimeMillis()) {
//			Object paramValue = CacheUtil.getCache().hget(nameSpace, key);
//			cacheWapper.setValue(paramValue);
//			cacheWapper.setExpiresTime(System.currentTimeMillis() + expiresTime);
//			caches.put(key, cacheWapper);
//		}
//		return caches.get(key).getStringValue();
//	}
//
//	@SuppressWarnings("unchecked")
//	private static Map<Object, Object> getHashCaches(String nameSpace, String key) {
//		Map<String, CacheWapper> caches = getNameSpaceCaches(nameSpace);
//		CacheWapper cacheWapper = caches.get(key);
//		Map<Object, Object> map = null;
//		if (cacheWapper == null) {
//			map = CacheUtil.getCache().hashgetAll(nameSpace + key);
//			if (map != null) {
//				cacheWapper = new CacheWapper(map, System.currentTimeMillis() + expiresTime, CacheType.Redis);
//				caches.put(key, cacheWapper);
//			}
//		} else if (cacheWapper.getCacheType() == CacheType.Redis
//				&& cacheWapper.getExpiresTime() < System.currentTimeMillis()) {
//			map = CacheUtil.getCache().hashgetAll(nameSpace + key);
//			if (map != null) {
//				cacheWapper.setValue(map);
//				cacheWapper.setExpiresTime(System.currentTimeMillis() + expiresTime);
//				caches.put(key, cacheWapper);
//			}
//		}
//		if (cacheWapper.getValue() == null) {
//			throw new BusinessException(HttpCode.BUSINESS_ERROR, "key " + key + " value is empty!");
//		}
//		return (Map<Object, Object>) cacheWapper.getValue();
//	}
//
//	/**
//	 * 获取第三方平台管理配置
//	 *
//	 * @param appId    第三方平台新 appId
//	 * @param thirdkey 第三方平台字典键值
//	 * @return 第三方平台配置map
//	 */
//	public static Object getConfigMap(String appId, String thirdkey) {
//		if (StringUtils.isEmpty(appId)) {
//			throw new BusinessException(HttpCode.BUSINESS_ERROR, "appId is empty!");
//		}
//		Map<Object, Object> map = getHashCaches(Constants.THIRD_PARTY_KEY, appId);
//
//		// 如果没有指定某一个配置键值则返回所有配置
//		if (StringUtils.isEmpty(thirdkey)) {
//			return map;
//		}
//		Object obj = map.get(thirdkey);
//		if (StringUtils.isEmpty(obj)) {
//			throw new BusinessException(HttpCode.BUSINESS_ERROR, "key " + thirdkey + " value is empty!");
//		}
//		// 返回指定配置键值
//		return obj;
//	}
//
//	/**
//	 * 通过应答驱道 chanel , 应答编码 code 获取应答信息
//	 *
//	 * @param chanel
//	 * @param code
//	 * @return
//	 */
//	public String[] getErrorCode(String chanel, String code) {
//		String errCode = (String) gethCache(Constants.CACHE_SYS_PARAM + Constants.SYS_ERROR_CODE, chanel + "_" + code,
//				"");
//		return errCode.split("\\|");
//	}
//}
